package com.qingniao.hb.web.servlet;

import com.pig4cloud.captcha.ArithmeticCaptcha;
import com.qingniao.hb.entity.User;
import com.qingniao.hb.service.UserService;
import com.qingniao.hb.service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @author xlzhang
 * @date 2023/4/17 16:31
 */
@WebServlet("/user/*")
public class UserServlet extends BaseServlet {

    /**
     * 用户的服务对象
     */
    private final UserService userService = new UserServiceImpl();

    /**
     * 登录功能
     * @param request
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    public void login(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 设置编码格式
        request.setCharacterEncoding("utf-8");

        // 2. 先判断验证码
        // 获取用户登录时输入的验证码
        final String checkCode = request.getParameter("checkCode");
        final HttpSession session = request.getSession();
        // 获取项目的虚拟目录名称
        final String contextPath = getServletContext().getContextPath();

        // 再从session中获取保存的验证码
        final String saveCaptcha = (String) session.getAttribute("captcha");
        // 判断
        if (!checkCode.equalsIgnoreCase(saveCaptcha)){
            // 验证码错误
            System.out.println("验证码错误");
            session.setAttribute("errorInfo","验证码错误");
            // 使用重定向真正让浏览器回到登录页
            resp.sendRedirect(contextPath + "/login.html");
            return;
        }

        // 3. 获取用户名和密码
        final String username = request.getParameter("username");
        final String password = request.getParameter("password");
        System.out.println(username);
        // 4. 检查数据库中是否有这个用户名
        // 当前查询数据库数据，必须通过三层结构完成   web---service---dao
        final User user = userService.login(username);
        if (user == null){
            // 用户名错误
            System.out.println("你输入的用户名错误或不存在");
            session.setAttribute("errorInfo","用户名错误");
            resp.sendRedirect(contextPath + "/login.html");
            return;
        }
        // 判断密码是否正确
        if (!user.getPassword().equals(password)){
            System.out.println("输入的密码错误");
            session.setAttribute("errorInfo","密码错误");
            resp.sendRedirect(contextPath + "/login.html");
            return;
        }
        // 代码能执行到这里，表示当前的账号密码正确，登录成功
        //request.getRequestDispatcher("manager.html").forward(request,resp);
        // 使用重定向设置页面的跳转，目的就是让浏览器会显示真的跳转地址
        //resp.setStatus(302);
        //resp.setHeader("location","manager.html");
        //resp.sendRedirect("manager.html");
        // 将要在页面显示的内容，保存到请求域中
        // request.setAttribute("user",user);    // 请求域： 范围最小，只能是同一个请求才可以使用(请求转发)
        session.setAttribute("user",user);    // session域(会话域): 范围是基于一次会话的，隔离用户
        // getServletContext().setAttribute("user",user);  // 应用域：代表整个应用环境都可以使用,所有用户共享

        // 与之前的方式相同，使用重定向跳转到管理页
        resp.sendRedirect(contextPath + "/manager.html");
    }

    /**
     * 验证码功能
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    public void captcha(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置请求头为输出图片类型
        response.setContentType("image/gif");
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        // 创建一个验证码对象
        //SpecCaptcha specCaptcha = new SpecCaptcha(120, 40, 4);
        // 算术类型
        ArithmeticCaptcha captcha = new ArithmeticCaptcha(120, 40);
        captcha.setLen(2);  // 几位数运算，默认是两位

        // 获取当前生成验证码图片对应的结果字符串
        // 将当前的验证码对应的数据保存到session域中
        request.getSession().setAttribute("captcha",captcha.text());

        // 直接将验证码图片写入输出流中
        captcha.out(response.getOutputStream());
    }
}
